package gestorbienraizok.usuarios;

import gestorbienraizok.contratos.Compraventa;
import gestorbienraizok.contratos.Contrato;
import java.util.Calendar;
import java.util.LinkedList;
import static uiMain.bienRaizOk.listaDePersonas;

public class Funcionario extends Persona {

    private static int totalFuncionarios = 0;
    private long salarioBase;
    LinkedList<Cliente> listaDeClientesDemandantes;
    Cita[] listaDeCitas;

    public Funcionario(long cedula, String contrasenha, String nombre, long salarioBase) {
        super(cedula, contrasenha, nombre, (byte) 5);
        this.listaDeClientesDemandantes = new LinkedList();
        this.listaDeCitas = new Cita[16];
        this.salarioBase = salarioBase;
        Funcionario.totalFuncionarios++;
    }

    //Constructor para el jefe
    protected Funcionario(long cedula, String contrasenha, String nombre, byte nivelDeAcceso, long salario) {
        super(cedula, contrasenha, nombre, nivelDeAcceso);
        this.listaDeClientesDemandantes = new LinkedList();
        this.listaDeCitas = new Cita[16];
        Funcionario.totalFuncionarios++;
        this.salarioBase = salario;
    }

    public float getSalarioBase() {
        return this.salarioBase;
    }

    public LinkedList<Cliente> getListaDeClientesDemandantes() {
        return this.listaDeClientesDemandantes;
    }

    public void anhadirALaLista(Cliente nuevoCliente) {
        this.listaDeClientesDemandantes.add(nuevoCliente);
    }

    public String proximaCitaDisponible(Cita nuevaCita) {
        int i = 0;
        while (listaDeCitas[i] != null) {
            i++;
            if(i==listaDeCitas.length){
                break;
            }
        }
        if (i == listaDeCitas.length) {
            return "";
        } else {
            String[] nombreHoras = {"8:00 am", "8:30 am", "9:00 am", "9:30 am", "10:00 am", "10:30 am", "11:00 am", "11:30 am", "2:00 pm", "2:30 pm", "3:00 pm", "3:30 pm", "4:00 pm", "4:30 pm", "5:00 pm", "5:30 pm"};
            listaDeCitas[i] = nuevaCita;            
            return nombreHoras[i];
        }
    }

    public void quitarDeLaLista(Cliente clienteAQuitar) {
        this.listaDeClientesDemandantes.remove(clienteAQuitar);
    }

    public ClienteAnonimo buscarEnAgendaBorrarYDevolver(long cedula) {

        for (int i = 0; i < 16; i++) {
            Cita estaCita = listaDeCitas[i];
            if (estaCita != null) {
                ClienteAnonimo esteCliente = estaCita.getCliente();
                if (esteCliente.getCedula() == cedula) {
                    listaDeCitas[i] = null;
                    return esteCliente;
                }
            }
        }
        return null;
    }

    public static Funcionario funcionarioAleatorio() {

        //Genera el numero del funcionario al azar       
        int aleatorio = (int) ((Funcionario.totalFuncionarios - 0) * Math.random());

        int contador = -1;
        Persona estaPersona;
        for (int i = 0; i < listaDePersonas.size(); i++) {
            estaPersona = listaDePersonas.get(i);
            if (estaPersona instanceof Funcionario) {                
                contador++;
                if (contador == aleatorio) {
                    return (Funcionario) estaPersona;                    
                }               
            }
        }
        return null;
    }

    public String listaDeClientesDemandantes() {
        String lista = new String();
        lista += "Cliente   Cédula       Nombre\n";
        lista += "----------------------------------------------\n";
        for (int i = 1; i <= this.listaDeClientesDemandantes.size(); i++) {
            ClienteDemandador esteCliente = (ClienteDemandador) this.listaDeClientesDemandantes.get(i - 1);
            lista += String.format("%-10d",i) +  String.format("%-13d", esteCliente.getCedula()) + esteCliente.getNombre() + "\n";
        }
        lista += "\n";

        return lista;
    }
    
    public void calcularSalario(byte mes, int anho, float[] comisionPorVentas, float[] comisionPorArrendamientos){
                
        for (int i = 0; i < this.getListaDeClientesDemandantes().size(); i++) {
            ClienteDemandador esteClienteDemandador = (ClienteDemandador) this.getListaDeClientesDemandantes().get(i);
            for (int j = 0; j < esteClienteDemandador.getListaDeContratos().size(); j++) {
                Contrato esteContrato = esteClienteDemandador.getListaDeContratos().get(j);
                if (esteContrato instanceof Compraventa) {
                    if (esteContrato.getMes() == mes && esteContrato.getAnho() == anho) {
                        comisionPorVentas[0] += esteContrato.getValor() * 0.05f;
                    }
                } else {
                    if (esteContrato.getMes() <= mes && esteContrato.getAnho() <= anho) {
                        comisionPorArrendamientos[0] += esteContrato.getValor() * 0.01f;                        
                    }
                }
            }
        }        
    }
    
    public float calcularSalarioTotalAHoy(){
        float[] comisionPorVentas = {0};
        float[] comisionPorArrendamientos = {0};
        
        this.calcularSalario((byte) (Calendar.getInstance().getTime().getMonth()+1),Calendar.getInstance().getTime().getYear()+1900, comisionPorVentas, comisionPorArrendamientos);
        
        return comisionPorVentas[0] + comisionPorArrendamientos[0] + this.getSalarioBase();
    }

    @Override
    public String tipoDePersona() {
        return "funcionario";
    }
}
